#include <iostream>
#include <sys/types.h>
#include <unistd.h>
#include <signal.h>
using namespace std;

// now: 测试：进程正在处理2号信号时，收到其他信号会不会执行？ --- 会
/*
    现象：
    1.在处理2号信号过程中，收到3号信号时会处理3号信号，3号处理完毕后继续处理2号信号。
    2.在处理2号信号时，继续发送2号信号，此时pending位图中2号被置为1，表示2号信号未递达，当处理完第一轮2号信号后，被block的2号信号递达，继续处理2号信号。
*/
void show_sigset(sigset_t *set)
{
    for (int i = 1; i < 32; i++)
    {
        if (sigismember(set, i))
            putchar('1');
        else
            putchar('0');
    }
    puts("");
}
void handler(int signo)
{
    cout << "收到了[" << signo << "]号信号" << endl;
    int cnt = 5;
    while (cnt--)
    {
        cout << "正在执行" << signo << "号信号的handler方法" << endl;
        cout << "此刻的pending位图：";
        sigset_t p;
        sigpending(&p);
        show_sigset(&p);
        sleep(1);
    }
}

int main()
{
    cout << "我的pid是:[" << getpid() << "]" << endl;
    struct sigaction act;
    act.sa_handler = handler;
    sigaction(2, &act, nullptr);
    sigaction(3, &act, nullptr);
    while (true)
        ;
    return 0;
}